import { useState, useEffect } from 'react';
import { usePersistFn } from 'ahooks';
import useWebSocket from '@/common/useWebsocket';

const useChatState = ({ data, pushDanmaku, createPlayer, destroyPlayer }) => {
  const [onlineCount] = useState(0);
  const [message, setMessage] = useState([]);
  const [liveNotice, setLiveNotice] = useState(null);

  // 添加消息
  const addMessage = usePersistFn((msg) => setMessage(message.concat(msg)));

  // 错误消息
  const errorMessageHandle = usePersistFn((content) => {
    // eslint-disable-next-line
    console.error(content);
    // const err = content.message || content.textMessage;
    // if (!err) return;

    // return enqueueSnackbar(err);
  });

  // 普通消息
  const simpleMessageHandle = usePersistFn((m, isHistory = false) => {
    // 添加到消息列表
    addMessage(m);
    // 发送弹幕
    if (pushDanmaku && !isHistory) pushDanmaku(m);
  });

  // 清空用户发言信息
  const clearUserMessageHandle = usePersistFn((userId) => {
    const list = message.filter(({ userId: _userId }) => _userId !== userId);
    setMessage(list);
  });

  // 删除单条发言信息
  const removeSingleUserMessageHandle = usePersistFn(({ msgId }) => {
    const list = message.filter(({ msgId: _msgId }) => msgId !== _msgId);
    setMessage(list);
  });

  // 主播更新公告
  const updateNoticeMessageHandle = usePersistFn(({ message: notice }) => {
    setLiveNotice(notice);
    // console.log(notice);
  });

  // 机器人消息
  // const robotMessageHandle = addMessage;

  // 消息回调
  const socketMessageHandle = usePersistFn((m) => {
    let res;
    try {
      res = JSON.parse(m);
    } catch {
      res = {};
    }
    const { errorCode, codeType: messageType, data: jsonString = '{}', fromuserid, message: resMessage } = res;
    let content;
    try {
      // 100034 文本数据 不需要解析
      content = /100034/.test(messageType) ? jsonString : JSON.parse(jsonString);
    } catch {
      content = {};
    }

    if (errorCode !== 0) return errorMessageHandle(content);

    switch (messageType) {
      // 普通发言消息
      case 100004: {
        const { roomId, fromuserid: userId, levelId: level, fromusername: username, textMessage, msgId } = content;
        const obj = {
          messageType,
          roomId,
          userId: userId || fromuserid,
          username,
          message: textMessage,
          level,
          msgId,
        };
        return simpleMessageHandle(obj);
      }
      // 历史消息
      case 100005: {
        if (!Array.isArray.call(window, content)) return;
        content.forEach((item) => {
          try {
            const { roomId, fromuserid: userId, levelId: level, fromusername: username, textMessage, msgId } = JSON.parse(item);
            const obj = {
              messageType,
              roomId,
              userId,
              username,
              message: textMessage,
              level,
              msgId,
            };
            return simpleMessageHandle(obj, true);
          } catch (e) {
            // eslint-disable-next-line
            console.error(e);
          }
        });
        return;
      }
      // 欢迎进入直播间
      case 100006: {
        const { fromusername: username, textMessage } = content;
        const obj = {
          messageType,
          username,
          message: textMessage,
        };
        return simpleMessageHandle(obj);
      }
      // 超管禁言
      case 100008: {
        const { textMessage } = content;
        const obj = {
          messageType,
          message: textMessage,
        };
        return simpleMessageHandle(obj);
      }
      // 主播禁言
      case 100009: {
        // {"errorCode":0,"message":"禁言用户通知发送成功","codeType":100009,"roomId":"28","data":"{\"textMessage\":\"盼盼已被禁言1天\",\"fromuserid\":2,\"fromusername\":\"光亮的专家\",\"messageType\":2,\"levelId\":1,\"fromhederimg\":\"https://sports1.oss-cn-beijing.aliyuncs.com/2020/06/05/7691b048-c4a5-44c9-b1af-54218d27160d/default(1).png\",\"time\":\"15:24:42\",\"roomId\":\"28\"}"}
        const { textMessage } = content;
        const obj = {
          messageType,
          message: textMessage,
        };
        return simpleMessageHandle(obj);
      }
      // 禁言
      case 100010: return errorMessageHandle(content);
      // 主播下播
      case 100011: {
        const obj = {
          messageType,
          message: '关闭直播', // 手动拼数据
        };
        simpleMessageHandle(obj);
        return destroyPlayer && destroyPlayer();
      }
      // 主播上播
      case 100012: {
        const obj = {
          messageType,
          message: '开始直播', // 手动拼数据
        };
        simpleMessageHandle(obj);
        return createPlayer && createPlayer();
      }
      // 禁言时清空数据
      case 100016:
        return clearUserMessageHandle(content); // content: userId
      // 系统广播
      case 100021: {
        const obj = {
          messageType,
          message: resMessage,
        };
        return simpleMessageHandle(obj);
      }
      // 说话太快了
      case 100022: return errorMessageHandle(content);
      // 更新公告
      case 100023:
        // {"errorCode":0,"message":"更新公告2","codeType":100023,"roomId":"28"}
        return updateNoticeMessageHandle(res);
      // 禁图
      // 发图频繁
      case 100029: return errorMessageHandle(content);
      case 100030: return errorMessageHandle(content);
      // 超管解禁
      case 100031: return errorMessageHandle(content);
      // 主播解禁
      case 100032: return errorMessageHandle(content);
      // 删除单条用户发言信息
      case 100034: {
        const obj = {
          messageType,
          msgId: content,
        };
        return removeSingleUserMessageHandle(obj);
      }

      // // 足球赛程信息推送
      // case 100018:
      //   x = {
      //     code: message.codeType,
      //     list: data.textMessage,
      //   };
      //   Vue.prototype.$bus.$emit("refreshFootballSchedule", x)
      //   break;
      // // 篮球赛程信息推送
      // case 100019:
      //   x = {
      //     code: message.codeType,
      //     list: data.textMessage,
      //   };
      //   Vue.prototype.$bus.$emit("refreshBasketballSchedule", x)
      //   break;

      default:
    }

    // 机器人消息
    // if (codeType === 6) return robotMessageHandle(content);
    // 礼物消息
    // if (codeType === 2) return giftMessageHandle(m);
    // 预测购买消息
    // if (codeType === 9) return forecastPurchaseMessageHandle(m);
    // 抢红包消息
    // if (codeType === 13) return addMessage(m);
    // 发红包消息
    // if (codeType === 12) return sendRedPackMessageHandle(m);
  });

  // websocket连接
  const { id } = data; // 主播id
  const path = `youke_${new Date().getTime()}?s=2`;
  const { ws, connect, disconnect, send } = useWebSocket({
    path,
    msgType: 'jsonString',
    onMessage: socketMessageHandle,
    heartCheckMsg: { codeType: 100003, message: 'ping', roomId: id },
    openMsg: [
      { codeType: 100001, roomId: id, message: '进入直播间' },
      { codeType: 100005, roomId: id, message: '进入直播间' },
    ],
    closeMsg: [
      { codeType: 100002, roomId: id, message: '退出直播间' },
    ],
  });
  useEffect(() => {
    connect();
    return disconnect;
  }, []);

  return {
    socket: ws,
    onlineCount,
    message,
    newLiveNotice: liveNotice,
    setMessage,
    sendMessage: send,
  };
};

export default useChatState;

// 进入直播间(100001, "进入直播间"),//会员游戏状态
// 退出直播间(100002, "退出直播间"),//会员余额
// 心跳检测(100003, "心跳检测"),//心跳检测
//
// 发送房间消息(100004, "发送消息"),//发送房间消息 群发消息
// 获取房间历史消息(100005, "发送消息"),//获取房间历史消息 最近90条消息
// 进入直播间通知(100006, "进入直播间通知"),//链接成功的时候通知
// 赠送礼物(100007, "赠送礼物"),//赠送礼物
// 超管禁言通知(100008, "超管禁言通知"),//禁言系统通知 超管禁言在直播间内通知
// 主播禁言通知(100009, "主播禁言通知"),//禁言用户通知 在直播间内通知
// 禁言通知(100010, "禁言通知"),//禁言通知 只通知用户
//
// 主播下播(100011, "主播下播"),//主播下播
// 主播上播(100012, "主播上播"),//主播上播
// 清空聊天记录(100013, "清空聊天记录"),//清空聊天记录
//
// 获取积分(100014, "获取积分"),//清空聊天记录
// 获取房间热度(100015, "获取房间热度"),//获取房间热度
//
// 清空用户消息(100016, "清空用户消息"),//清空用户消息通知
//
// //进球通知(100017, "进球通知"),//进球通知
// 比赛详情 (100017, "比赛详情 "),//比赛详情
// 刷新足球列表 (100018, "刷新足球列表 "),//刷新足球列表
// 刷新篮球列表(100019, "刷新篮球列表"),//刷新篮球列表
// 进球通知(100020, "进球通知"),//进球通知
